import {
  setToken,
  getToken,
  removeToken
} from '@/utils/auth'

import { loginAPI, getUserProfileAPI } from '@/api/user'

// 导入静态路由表
import { constantRoutes, resetRouter } from '@/router'
const state = {
  // token
  token: getToken() || '',
  // 用户信息
  userInfo: {},
  // 路由表,默认值值静态路由表
  routes: constantRoutes
}
const mutations = {
  // 设置token
  setToken (state, token) {
    // 存vuex
    state.token = token
    // 存本地
    setToken(token)
  },
  // 删除token
  removeToken (state) {
    // 清空vuex中的token
    state.token = ''
    // 清空本地token
    removeToken()
  },
  // 设置用户信息
  setUserInfo (state, userInfo) {
    state.userInfo = userInfo
  },
  // 删除用户信息
  removeUserInfo (state) {
    state.userInfo = {}
  },
  // 设置路由表
  setRoutes (state, filteredAsyncRoutes) {
    state.routes = [
      ...constantRoutes,
      ...filteredAsyncRoutes
    ]
  },
  // 清空路由表
  removeRoutes (state) {
    state.routes = []
  }
}

// actions函数2个作用：
// 1. 编写异步代码
// 2. 包装多个mutation函数
const actions = {
  // 登录action函数
  async loginAction (store, loginForm) {
    // 发登录请求
    const token = await loginAPI(loginForm)
    // 提交mutation
    store.commit('setToken', token)
  },
  // 获取用户信息action函数
  async getUserInfoAction (store) {
    // 发请求获取用户信息
    const userInfo = await getUserProfileAPI()
    // 提交mutation函数
    store.commit('setUserInfo', userInfo)
    // 返回用户信息
    return userInfo
  },
  // 退出action函数
  logoutAction (store) {
    store.commit('removeToken')
    store.commit('removeUserInfo')

    // 重置路由表router
    resetRouter()
    // 重置vuex中的路由表
    store.commit('removeRoutes')
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
